const {Maybe, Container} = require('./support')
const fp = require('loadsh/fp')
const _ = require('loadsh')

// 第一题
// 使用 fp.add(x,y) 和 fp.map(f,x) 创建了一个能让 functor 里的值增加的函数 ex1
let maybe = Maybe.of([5,6,1])
let ex1 = (x) => {
    // 实现的函数
    // let newAdd = _.curry(fp.add)
    // return fp.map(newAdd(1),x)
    return fp.map(fp.add(1),x)
}
console.log(maybe)
console.log("第一题答案 ex1:", maybe.map(x => ex1(x)))

// 第二题
// 实现一个函数 ex2 , 能够使用 fp.first 获取列表的第一个元素
const xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = (x) =>{
    return fp.first(x)
}
console.log(xs)
console.log("第二题答案 ex2:", xs.map(x => ex2(x)))

// 第三题
// 实现一个函数 ex3 ，能够使用 safeProp 和 fp.first 找到 user 的名字的首字母
let safeProp = fp.curry(function(x,o){
    return Maybe.of(o[x])
})

let user = { id: 2, name: 'Albert'}

let ex3 = (x) => {
    let newFunctor = safeProp('name', x)
    let result = null
    newFunctor.map(val => {
        result = fp.first(val)
    })
    return result
}
console.log("第三题答案 ex3:", ex3(user))

// 第四题
// 使用 Maybe 重写 ex4, 不要有 if 语句
let ex4 = function (n){
    if(n){
        return parseInt(n)
    }
}

let newEx4 = (n) => {
    let newFunctor =  Maybe.of(n)
    let result = null
    newFunctor.map(val => {
        result = parseInt(val)
    })
    return result
}
console.log('ex4 ~ 4：', ex4(4))
console.log('newEx4 ~ 4：', newEx4(4))
console.log('ex4 ~ undefined：', ex4(undefined))
console.log('newEx4 ~ undefined：', newEx4(undefined))
console.log('ex4 ~ null：', ex4(null))
console.log('newEx4 ~ null：', newEx4(null))